#include "MQ.h"
#include "main.h"
#include "uart_Func.h"




QUEUE_HandleTypeDef Q_Uart_Handle; //消息池结构体
QUEUE_HandleTypeDef Q_Uart_len_Handle; //单包数据长度记录结构体
QUEUE_HandleTypeDef Q_Uart_Type_Handle; //压入数据对象指定
QUEUE_DATA_T Q_Uart_buff[Q_UART_BUFFER_SIZE];  //消息池
QUEUE_DATA_T Q_Uart_len[Q_UART_LEN_SIZE];  //消息池长度记忆
QUEUE_DATA_T Q_Uart_Type[Q_UART_LEN_SIZE];  //消息池串口类型记忆

#ifndef Data_Len_Max
#define Data_Len_Max 50
#endif

/*****************************************************************************************
函数作用：消息队列初始化
使用		：在所有外设初始化后调用
调用说明：目前只使用了常用的方式，开一个队列
          通过Type来确定是哪种消息
外部声明：
*****************************************************************************************/
void MQ_uart_Init(void)
{
  Queue_Init(&Q_Uart_Handle,Q_Uart_buff,Q_UART_BUFFER_SIZE);
  Queue_Init(&Q_Uart_len_Handle,Q_Uart_len,Q_UART_LEN_SIZE);
  Queue_Init(&Q_Uart_Type_Handle,Q_Uart_Type,Q_UART_LEN_SIZE);

}

/*****************************************************************************************
函数作用：将输入压入消息队列
使用		：只有MQ函数会调用，存入一包数据
调用说明：Type，要存入的信息类型
          *arry，要存储的一包数据
          len，要返回的数据长度
外部声明：
*****************************************************************************************/
void Mes_uart_Press(uint8_t Type,uint8_t *arry,uint16_t len)
{
  Queue_Push(&Q_Uart_Type_Handle,Type);
  Queue_Push(&Q_Uart_len_Handle,len);
  Queue_Push_Array(&Q_Uart_Handle,arry,len);
}

/*****************************************************************************************
函数作用：将消息队列的数据读取出来
使用		：只有MQ函数会调用，弹出一包数据
调用说明：*Type，要返回的信息类型
          *arry，要返回的一包数据
          *len，要返回的数据长度
外部声明：仅仅函数内部可见，外部不能调用
*****************************************************************************************/
static void Mes_uart_Pop(uint8_t *Type,uint8_t *arry,uint8_t *len)
{
  Queue_Pop(&Q_Uart_Type_Handle,Type);
  Queue_Pop(&Q_Uart_len_Handle,len);
  Queue_Pop_Array(&Q_Uart_Handle, arry,*len);   
}



void Message_Processing_Pool(void)
{
  uint8_t Type=0,len;
  uint8_t Arry[Data_Len_Max];
//  static u32 time = 0;
//	Usart1DmaPrintf("MQT:%d\n",HAL_GetTick()-time);
//	time = HAL_GetTick();
  //取出队列中的消息
  if(Queue_Count(&Q_Uart_Handle)!=0)
  {
    Mes_uart_Pop(&Type,Arry,&len);
//    printf_uart2("This Queue Data%d:= %s \n",len,Arry);
  }
  
  switch(Type)
  {
    case 0xa1:  
			uart_func(Arry,len);
    break;
    case 0xa2:   
//			printf_uart2("This Queue Data :=%d\n",len);
			
    break;
    
    case 0xa3:      break;
    case 0xa4:     	break;
    case 0xa5:     	break;
    case 0xa6:  		break;
    case 0xa7: 			break;  
    case 0xa8:    	break;      
    
  }
}



